package com.mlh.Slidingwindow;


import java.util.HashSet;
import java.util.Set;

/**
 * @author 缪林辉
 * @date 2024/8/14 22:52
 * @DESCRIPTION
 */
//给定一个字符串 s ，请你找出其中不含有重复字符的最长子串的长度。
// 输入: s = "abcabcbb"
// 输出: 3
// 解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
public class 无重复字符的最长子串 {
    public static void main(String[] args) {
        String s="pwwkew";
        int i = method1(s);
        System.out.println(i);
    }
    //可以优化  重复判断了很多次

    public static int method1(String s) {
        Set<Character> set=new HashSet<>();
        int maxLen=0;
        for (int i = 0; i < s.length(); i++) {
            set.add(s.charAt(i));
            int right=i+1;
            while(right<s.length()&&!set.contains(s.charAt(right))){
                set.add(s.charAt(right));
                right++;
            }
            maxLen= Math.max(maxLen,right-i);
            set.clear();
        }
        return maxLen;
    }

    //每次不需要把set清空，而是把i位置的字符删掉即可，然后接着上一次的右指针继续判断即可
    public static int method2(String s) {
        if(s.length()<=1){
            return s.length();
        }
        Set<Character> set=new HashSet<>();
        int maxLen=0;
        int right=1;//right所指位置的字符都是没有加入到set中的
        set.add(s.charAt(0));
        for (int i = 0; i < s.length(); i++) {
            while(right<s.length()&&!set.contains(s.charAt(right))){
                set.add(s.charAt(right));
                right++;
            }
            maxLen= Math.max(maxLen,right-i);//这里right没有加入到set中，所以不要+1
            set.remove(s.charAt(i));
        }
        return maxLen;
    }

    public static int practice(String s) {
        if(s.length()<2){
            return s.length();
        }
        char[] chars = s.toCharArray();
        HashSet<Character>set=new HashSet<>();
        int len=1,maxLen=0;
        int right=1;
        set.add(chars[0]);
        for (int i = 0; i < chars.length; i++) {//i就是左指针
            while (right<chars.length&&!set.contains(chars[right])){//right是右指针
                set.add(chars[right]);
                ++right;
                ++len;
            }
            //发生重复了左指针就移动，直到不发生重复
            maxLen=Math.max(maxLen,len);
            set.remove(chars[i]);
            --len;
        }
        return maxLen;
    }
}
